/******************************************************************************************
 * Import
 ******************************************************************************************/

// module
import io from 'socket.io-client';

// project
import {Collect, Session} from '../../../library';
import {Config} from '../../../preset';

/******************************************************************************************
 * Export Class
 ******************************************************************************************/

export default class Socket {
    
    /**
     * 初始化
     * 
     * @param {String} url 连接的url地址
     */
    constructor(url) {

        // url字符串
        this.url = url;

        // socket对象
        this.socket = null;

        // 是否在线指示器
        this.online = false;

        // 初始化socket，并连接服务器
        this.connect();
    }

    /**
     * 初始化socket，并设置默认事件
     * 
     * @param {String} url 连接的url地址
     */
    connect() {
        
        // 初始化
        this.socket = io(this.url);

        // 连接成功，指示当前已在线
        this.socket.on('connect', ()=> {
            this.online = true;
        });

        // 连接失败，记录错误，指示当前已离线
        this.socket.on('connect_error', (err)=> {
            // Collect.error(Session.get('profile_arrive'), 'func', 'http.js', method, obj.url, obj.data, err);
            this.online = false;
        });

        // 连接超时，记录超时，指示当前已离线
        this.socket.on('connect_timeout', (timeout)=> {
            // Collect.error(Session.get('profile_arrive'), 'func', 'http.js', method, obj.url, obj.data, err);
            this.online = false;
        });

        // 任意错误，记录错误
        this.socket.on('error', (err)=> {
            // Collect.error(Session.get('profile_arrive'), 'func', 'http.js', method, obj.url, obj.data, err);
            this.online = false;
        });

        // 关闭连接，指示当前已离线
        this.socket.on('disconnect', (reason)=> {
            this.online = false;
        });

        // 重新连接完成，指示当前已在线
        this.socket.on('reconnect', (attemptNumber)=> {
            this.online = true;
        });

        // 再次连接失败，记录失败，指示当前已离线，
        this.socket.on('reconnect_error', (err)=> {
            // Collect.error(Session.get('profile_arrive'), 'func', 'http.js', method, obj.url, obj.data, err);
            this.online = false;
        });

        // // 试图重新连接
        // this.socket.on('reconnect_attempt', (attemptNumber)=> { });

        // // 重新连接中，
        // this.socket.on('reconnection', (attemptNumber)=> { });

        // // 重新连接失败
        // this.socket.on('reconnect_failed', ()=> { });
    }

    /**
     * 重新连接
     */
    reconnect() {
        this.connect();
    }

    /**
     * 发送socket消息
     * 
     * @param {String} name 发送的事件名
     * @param {Any} data 发送的数据
     */
    emit(name, data) {

        // 如果当前在线，则发送
        if (this.online) {
            this.socket.emit(name, data);
        } 
        
        // 否则，记录错误
        else {

        }
    }

    /**
     * 接收socket消息
     * 
     * @param {String} name 监听的事件名
     * @param {Function} callback 监听的回调方法
     */
    on(name, callback) {
        this.socket.on(name, callback);
    }
}
